如果想要透過CI/CD把在git或gitlab的程式碼自動部署到AWS EC2,除了用Opsworks之外,也可以使用AWS CodePipeline做自動化部署,接下來會介紹使用AWS CodePipeline需要哪些事前準備,以及如何使用CodePipeline,今天會先來介紹事前準備的部分。
在設定AWS CodePipeline前,需要幾個前置作業,才能夠順利的把程式碼從git或gitlab拉到EC2裡面:
為了能夠在CodeDeploy部署的時候,讓EC2知道要執行哪些指令和設定,程式碼必須包含appspec.yml檔。這個yml檔可以設定好每個部署階段需要執行的script。
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/
hooks:
BeforeInstall:
- location: test.sh
timeout: 300
runas: root
AfterInstall:
- location: test.sh
timeout: 300
runas: root
ApplicationStart:
- location: test.sh
- location: test.sh
timeout: 300
runas: root
ApplicationStop:
- location: test.sh
timeout: 300
runas: root
以上面的範例來說,需要執行test.sh這個script,那麼就需要把這個script放在指定的路徑。
Example: https://gitlab.com/hjoruhjoru/go-socket-server/-/tree/stage-dev?ref_type=heads
EC2可以透過serverless framwork和cloudformation進行deploy,可以參考Day 12: 使用serverless framework建置AWS EC2這篇文章。
CodePipeline部署時,如果是選擇從s3取得build好的程式碼,EC2需要額外設定role,並在policy設定允許存取s3的權限。在serverless.yml裡面,可以透過InstanceProfile為EC2設定符合需求的iam role和policy。
resources:
Resources:
MyEC2SSMRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: EC2SSMRolePolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- s3:*
Resource: "*"
EC2InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref MyEC2SSMRole
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0e82a6c15615ee580
KeyName: test-blue-green
InstanceType: t2.micro
SubnetId: subnet-0765f5ad5c906b284
SecurityGroupIds:
- sg-0ac58053047cef6d1
IamInstanceProfile: !Ref EC2InstanceProfile
這樣我們就準備好部署程式碼到EC2的前置作業。